<!DOCTYPE html>
<html lang="en">

<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
	
	<!-- title -->
	
	<title>
	
		05.选择数据库和技术选型 | 
	 
	对线面试官
	</title>
	
	<!-- keywords,description -->
	 
		<meta name="description" content="Java一线大厂面试" />
	

	<!-- favicon -->
	
	<link rel="shortcut icon" href="/luffy/favicon.ico">
	


	<!-- search -->
	<script>
		var searchEngine = "https://www.baidu.com/s?wd=";
		if(typeof searchEngine == "undefined" || searchEngine == null || searchEngine == ""){
			searchEngine = "https://www.google.com/search?q=";
		}
		var homeHost = "";
		if(typeof homeHost == "undefined" || homeHost == null || homeHost == ""){
			homeHost = window.location.host;
		}
	</script>


	
<link rel="stylesheet" href="/luffy/css/main.css">

	
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/styles/darcula.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css">


	
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/highlight.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/npm/jquery-pjax@2.0.1/jquery.pjax.min.js"></script>

	
<script src="/luffy/js/main.js"></script>

	
		
<script src="https://cdn.jsdelivr.net/npm/leancloud-storage/dist/av-min.js"></script>

		
<script src="https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js"></script>

	
	
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
	<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?3efe99c287df5a1d6f0d02d187e403c1";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<header id="header">
    <a id="title" target="_blank" rel="noopener" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NzA3MTc5Mg==&action=getalbum&album_id=1657204970858872832&scene=126#wechat_redirect" class="logo">对线面试官</a>

	<ul id="menu">
		
	

	

		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				【戳这里】获取更多原创干货💪💪
			</a>
		</li>
		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				<i class="fa fa-github fa-2x"></i>
			</a>
		</li>
	</ul>
</header>

	
<div id="sidebar">
	<button id="sidebar-toggle" class="toggle" ><i class="fa fa-arrow-right " aria-hidden="true"></i></button>
	
	<div id="site-toc">
		<input id="search-input" class="search-input" type="search" placeholder="按回车全站搜索">
		<div id="tree">
			

			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										00-面试前准备
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/00-%E9%9D%A2%E8%AF%95%E5%89%8D%E5%87%86%E5%A4%87/01.%E7%AE%80%E5%8E%86/">
										01.简历
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										01-Java基础
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/01.%20%E6%B3%A8%E8%A7%A3/">
										01. 注解
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/02.%20%E6%B3%9B%E5%9E%8B/">
										02. 泛型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/03.%20JavaNIO/">
										03. JavaNIO
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/04.%20%E5%8F%8D%E5%B0%84%E5%92%8C%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/">
										04. 反射和动态代理
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										02-Java并发
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/01.%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%9F%BA%E7%A1%80/">
										01. 多线程基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/02.%20CAS/">
										02. CAS
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/03.%20synchronized/">
										03. synchronized
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/04.%20AQS%E5%92%8CReentrantLock/">
										04. AQS和ReentrantLock
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/05.%20%E7%BA%BF%E7%A8%8B%E6%B1%A0/">
										05. 线程池
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/06.%20ThreadLocal/">
										06. ThreadLocal
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/07.%20CountDownLatch%E5%92%8CCyclicBarrier/">
										07. CountDownLatch和CyclicBarrier
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/08.%20%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										08. 为什么需要Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/09.%20%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAJava%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										09. 深入浅出Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										03-Java容器
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/01.%20List%E9%9B%86%E5%90%88/">
										01. List集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/02.%20Map%E9%9B%86%E5%90%88/">
										02. Map集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										04-Java虚拟机
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/01.%20Java%E7%BC%96%E8%AF%91%E5%88%B0%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%87%E7%A8%8B/">
										01. Java编译到执行的过程
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/02.%20%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%9C%BA%E5%88%B6/">
										02. 双亲委派机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/03.%20JVM%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84/">
										03. JVM内存结构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/04.%20%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/">
										04. 垃圾回收机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/05.%20CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										05. CMS垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/06.%20G1%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										06. G1垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/24/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/07.%20JVM%E8%B0%83%E4%BC%98/">
										07. JVM调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										05-Spring
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/01.%20SpringMVC/">
										01. SpringMVC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/02.%20Spring%E5%9F%BA%E7%A1%80/">
										02. Spring基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/03.%20SpringBean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/">
										03. SpringBean生命周期
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										06-Redis
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/01.%20Redis%E5%9F%BA%E7%A1%80/">
										01. Redis基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/02.%20Redis%E6%8C%81%E4%B9%85%E5%8C%96/">
										02. Redis持久化
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/03.%20Redis%E4%B8%BB%E4%BB%8E%E6%9E%B6%E6%9E%84/">
										03. Redis主从架构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/04.%20Redis%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4/">
										04. Redis分片集群
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										07-消息队列
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/01.%20Kafka%E5%9F%BA%E7%A1%80/">
										01. Kafka基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/02.%20%E4%BD%BF%E7%94%A8Kafka%E4%BC%9A%E8%80%83%E8%99%91%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98/">
										02. 使用Kafka会考虑什么问题
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										08-MySQL
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/01.%20MySQL%E7%B4%A2%E5%BC%95/">
										01. MySQL索引
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/02.%20MySQL%E4%BA%8B%E5%8A%A1%E5%92%8C%E9%94%81%E6%9C%BA%E5%88%B6%E5%92%8CMVCC/">
										02. MySQL事务和锁机制和MVCC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/03.%20MySQL%E8%B0%83%E4%BC%98/">
										03. MySQL调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										09-项目场景类
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/01.%20%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%8E%BB%E9%87%8D%E5%92%8C%E5%B9%82%E7%AD%89/">
										01. 如何实现去重和幂等
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/02.%20%E7%B3%BB%E7%BB%9F%E9%9C%80%E6%B1%82%E5%A4%9A%E5%8F%98%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1/">
										02. 系统需求多变如何设计
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/03.%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">
										03. 设计模式
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										10-计算机网络
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/25/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01.%20HTTP/">
										01. HTTP
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/13/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02.TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%92%8C%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B/">
										02.TCP三次握手和四次挥手
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										11-算法
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/01/11-%E7%AE%97%E6%B3%95/01.%20%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/">
										01. 排序算法
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Easy/">
										02. LeetCode Easy
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Medium/">
										02. LeetCode Medium
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										12-austin项目
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
										00.项目介绍
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										01.环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/02.%E6%97%A5%E5%BF%97/">
										02.日志
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/03.%E5%B7%A5%E5%85%B7%E5%8C%85/">
										03.工具包
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
										04.从一条短信开始
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file active">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/05.%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/">
										05.选择数据库和技术选型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/06.MySQL%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										06.MySQL环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/07.Kafka%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										07.Kafka环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
		</div>
	</div>
</div>

	<!-- 引入正文 -->
	<div id="content">
		<h1 id="article-title">

	05.选择数据库和技术选型
</h1>
<div class="article-meta">
	
	<span>3y</span>
	<span>2021-11-24 08:36:38</span>
		<div id="article-categories">
    
		<span>Categories：</span>
            
    

    
		<span>Tags：</span>
            
    
		</div>

</div>

<div id="article-content">
	<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501926&idx=1&sn=9fd2996baa50ce04c3569c490e15299c&chksm=ebd48967dca30071126d6d1d3f5eb08cf8a0d818a3c951c7dcc6bedb3c124f3d0c5166622379&token=358461825&lang=zh_CN#rd">第零篇</a>简单介绍了austin项目做什么用的，这两个月我重点会实现哪一块内容。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501892&idx=1&sn=9352f83e2a15003fb5ea61b83c569680&chksm=ebd48945dca3005371df9858c9347cea95b7a1424eb290659b781d3e07704b3207a3fce5126d&token=358461825&lang=zh_CN#rd">第一篇</a>用Maven+SpringBoot搭好了项目的架子，以及聊了下我对SpringBoot和Maven的看法。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501980&idx=1&sn=f2cb49ee1e40e529f31e588b062a1a23&chksm=ebd4899ddca3008b67bab1599edb5184b993c96806c6efee750863a6f7b46e6e54f1f72a4be0&token=970948001&lang=zh_CN#rd">第二篇</a>聊了下很容易被大家忽略的日志（这在项目中是非常重要的）</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247502034&idx=1&sn=9d673454afe83c2d4d516d22ff847ebf&chksm=ebd489d3dca300c5587f1a4b18c8a44cacf78b824aeda7ad08b1553aefdc5afad80f1b1e8bc5&token=1347092722&lang=zh_CN#rd">第三篇</a>推荐了些经常用到的工具包（简化我们的开发也能提高代码的可读性）</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247502098&idx=1&sn=0bfd929ba921e6c788b00f6093708dbd&chksm=ebd48813dca30105a033425285afd79a3d9c0bacfa83a62a9c0543f8a1857b71fd1eba5626a3&token=1688615309&lang=zh_CN#rd">第四篇</a>实现了短信发送的最基本功能</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247502138&idx=1&sn=623b0b6fc09d0d894872fbf2d0b31147&chksm=ebd4883bdca3012def1ee0a62bce357bb6832c863ef921c844eb53afd694a48539389c4693f9&token=1688615309&lang=zh_CN#rd">番外篇 #01</a>保姆级教如何使用austin</p>
<p>这是austin项目系列的第五篇了，要进入整体开始完善项目的各种功能的阶段啦，就从数据库开始入手吧。</p>
<p>今天想跟大家聊聊数据库层面上的事</p>
<p>（<strong>注</strong>：今天聊的数据库都特指关系型数据库）</p>
<h2 id="01、数据库选择"><a href="#01、数据库选择" class="headerlink" title="01、数据库选择"></a>01、数据库选择</h2><p>之前发了一张我可能要在austin项目上引入哪些技术栈的图，好多人问我分布式配置中心为什么不选择Nacos，而是用Apollo。却没人问我为什么数据库选择MySQL。</p>
<p>说起来MySQL，在网上看到的各类Java教程，几乎都是使用MySQL作为数据库。日常在群里聊各种数据库上的问题，也差不多都是MySQL，只有个别的可能用PostgreSQL和Oracle或其他</p>
<p>就连我在面试的时候，我也没被面试官问过：“你的数据库为什么选择MySQL啊？这块技术选型是怎么样的”</p>
<p>看到这里，是不是觉得我有答案了？其实我也没有。写到一半的时候发现我也说不出啥比较好的理由…既然我不知道，于是我就去看看人家是怎么说的。</p>
<p><a target="_blank" rel="noopener" href="https://www.zhihu.com/question/21793412/answer/32127410">https://www.zhihu.com/question/21793412/answer/32127410</a></p>
<p>总结原因可能是：</p>
<ul>
<li>前期MySQL免费开源易用，从众多厂商中硬生生搞出了生态。有了生态，很难就被干掉了。（<strong>最主要的</strong>）</li>
<li>互联网用MySQL就是用来存数据“低成本快速的数据存储插入方案”，要求也相对没那么高（<strong>这条我后面会详细聊聊</strong>）</li>
<li>很多时候对某技术选型并非是技术原因</li>
</ul>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdlp4kkc1j31m406st9b.jpg"></p>
<p>而我，我只会MySQL。我在生产环境下只用过MySQL，当年我还是小白的时候接触过Oracle，但现在也基本忘得差不多了。</p>
<p><strong>很多时候对某技术选型并非是技术原因</strong>（我是懒狗，我承认了）。近几年PostgreSQL很火，听说很多地方都比MySQL要好，感兴趣的小伙伴可以把austin项目的MySQL替换为PostgreSQL</p>
<p>对数据库选型感兴趣的大哥们也可以找点资料继续查阅资料，也很欢迎在评论区输出下自己的经验，这种话题讨论我觉得还是蛮有意思的。</p>
<p>跟着我一起做austin项目的小伙伴应该对关系型数据库都有所了解了，这里的基础我就不展开讲述了。对MySQL感兴趣或者准备要面试的同学，可以看看我《<strong>对线面试官</strong>》系列的MySQL章节（在各大博客平台中受到了不错的反馈）</p>
<h2 id="02、ORM框架选择"><a href="#02、ORM框架选择" class="headerlink" title="02、ORM框架选择"></a>02、ORM框架选择</h2><p>记得几年前我刚接触数据库和Java的时候，那时候要用JDBC连接数据库来操作数据，我就很不解：明明我可以通过各种的数据库客户端就能对数据进行操作，为啥我要用JDBC，好麻烦啊！</p>
<p>至于为什么会有这种疑问，我也不理解我当时是怎么想的（哈哈哈哈）。后来想通了以后，也学习了很多在程序上“简化JDBC模板”的姿势（<code>DBUtils</code>/<code>Hibernate</code>/<code>Spring JDBC</code>/<code>Mybatis</code>/<code>SpringData JPA</code>)</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdlri42rmj31dq096t9k.jpg"></p>
<p>我在生产环境中接触过的都是<code>Mybatis</code>，但这一次我在asutin项目中决定使用<code>SpringData JPA</code>作为ORM框架。</p>
<h2 id="03、使用数据库的经验"><a href="#03、使用数据库的经验" class="headerlink" title="03、使用数据库的经验"></a>03、使用数据库的经验</h2><p>这两年我是呆在互联网公司上班的，我就来聊下我个人所接触到的东西，分享下我的看法。</p>
<p>一般来说，每个业务团队维护着自己的数据库（一个业务团队可能就有好几个库），当我们需要某一个团队的相关数据时，团队会提供对应的RPC接口给公司内部业务使用。</p>
<p>这意味着<strong>数据逻辑对调用业务方而言，是透明的</strong>（调用业务方不需要关注其他团队数据库的任何信息，无论是数据库表设计还是具体的字段）。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdm7b4wrpj31j20nswhy.jpg"></p>
<p>这个好处是显然地：要某团队的业务数据，只要找到他们提供的接口就完事了。作为需求方，只需要调个接口就能拿到自己想要的数据。</p>
<p>回到数据库内部存储本身，我们会尽可能将表结构设计得更简单：在很多情况下，都会<strong>放弃数据库三大范式</strong>来设计表。</p>
<p>举个很简单又可能不太恰当的场景：一个作者可能会写多篇文章（意味着多篇文章会属于同一个作者） <code>author:content(1:N)</code></p>
<p>那在初学的时候，可能有的教程会这样设计：<code>author表</code>、<code>content表</code>、<code>autor_content_mapping表</code></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdn2thiuvj30re0em0u4.jpg"></p>
<p>但是，我们在实际中生产环境中<strong>很有可能</strong>是不设计这种关联表，而是直接把相关字段<strong>冗余</strong>在一张表里。这样在查询的时候，就能直接通过一张表查到对应的信息了，不用进行<strong>多层关联</strong></p>
<p>如果按上面的结构进行查询：比如我要查到某一篇文章的作者基本信息，那我此时的动作是：</p>
<ol>
<li>关联<code>author_content表</code>查到文章的<code>authorId</code></li>
<li>通过<code>authorId</code>去<code>author表</code>查到作者的基本信息</li>
</ol>
<p>如果我把<code>authorId</code>直接存到<code>content表</code>中，那就意味着少了去<code>author_content</code>表查询了。</p>
<p><strong>注</strong>：这里我不是说让你们把所有的信息都存在一张表里，一张表里有上百个字段，千万不要误会我的意思！</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdncl8dhcj30pi06gt98.jpg"></p>
<p>说起关联，又有一个能聊的话题：是否<code>join</code>（这个话题我曾经在我的交流群中聊过，不过也是各抒所见吧）。我在以前公司接触到的项目，在<code>mapper.xml</code>中都看不到<code>join</code>的身影，我写<code>join</code>只在<code>hive</code>写统计脚本的时候用到。</p>
<blockquote>
<p>【强制】超过三个表禁止 join。需要 join 的字段，数据类型必须绝对一致；多表关联查询时，保证被关联的字段需要有索引。</p>
<p>说明：即使双表 join 也要注意表索引、SQL 性能。</p>
</blockquote>
<p>喜欢用<code>join</code>的会告诉你：我写<code>join</code>会让代码变得更简单。查数据太麻烦了，要查的数据会存到多张表里，直接在用<code>join</code>的<strong>开发效率</strong>是最快的！</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwdo1xp8uyj30tg05wmxl.jpg"></p>
<p>而我，我是支持<strong>在代码里写业务逻辑</strong>的。所有都是单表查询，在程序代码中对数据进行关联（数据库的JOIN能干到的事，在程序上一定能干得到）。这样的好处就在于：<strong>SQL简单，SQL易复用，SQL易优化</strong></p>
<p>在绝大数情况下，我们的<strong>接口瓶颈都是来源于「数据库」</strong>，而非应用服务器。多JOIN且复杂的SQL是不好优化的，而简单的SQL是比较好优化的，并且我认为<strong>程序逻辑往往都要比SQL更容易维护</strong>。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhasg26ckj30y007maaf.jpg"></p>
<p>在我这两年在互联网公司中，关系型数据库在我的认知里，它就是作为一个<strong>支持事务</strong>的存储。如果我们存储的数据对事务没有要求的，可能压根就不需要存储至关系型数据库中。</p>
<p>现在数据源<strong>可选择的太多了</strong>，我们可以把数据存储到Redis(内存数据库)、Elasticsearch（搜索引擎）、HBase（分布式、可伸缩的大数据存储）、HDFS（分布式文件系统）、clickhouse（OLAP存储系统）等等等</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhbg3a04hj316207y0t2.jpg"></p>
<p>基于上面这些背景下，我的查询SQL就不会复杂，那么<code>Spring Data JPA</code>不就很适合我了么？</p>
<h2 id="04、开发之外的数据库"><a href="#04、开发之外的数据库" class="headerlink" title="04、开发之外的数据库"></a>04、开发之外的数据库</h2><p>去到有一定规模的公司，都会有数据库相关的基础建设，下面提下常见的基础建设吧</p>
<p><strong>一</strong>、DDL和DML都需要走工单</p>
<p>生产环境的数据库理论都不能通过自己编写接口在程序中修改（高危动作），需要修数据或者建表都需要经过工单系统审核（一般是数据库负责人+DBA）</p>
<p>比如你提交建表申请，DBA会看你的表设计是否合理（是否有加索引等等）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhc4781izj30oi0cqwf5.jpg"></p>
<p><strong>二</strong>、DQL查询线上数据需要权限</p>
<p>我们要查询线上的数据，一般都得申请库的权限，有了权限之后在公司内网特定的页面进行数据查询（我们一般只需要查团队内的数据，所以其实也还好，其他团队的数据库权限是不开放的，要数据一般只能通过接口获取）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhc9r68nzj3170062jrv.jpg"></p>
<p><strong>三</strong>、程序上一般不直连数据库（会有代理层）</p>
<p>一般只有线下数据库可以通过ip直连，线上数据库都会经过代理层（代理层可以做很多东西，包括监控鉴权分库分表等等）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhcjho6y3j317q06i0t8.jpg"></p>
<p><strong>四</strong>、完备的监控告警</p>
<p>数据库作为一个很重要的存储之一（如果挂了是真的影响很大），会有完备的监控和告警。比如说执行SQL失败的告警、执行慢SQL的告警等等，对数据库的各种指标进行实时监控</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhclq8xdij310c08iaal.jpg"></p>
<h2 id="05、austin建表DDL"><a href="#05、austin建表DDL" class="headerlink" title="05、austin建表DDL"></a>05、austin建表DDL</h2><p>如果有提前预习的同学，应该就知道在<code>austin.sql</code>下我放了两张表的DDL。为了让大家理解我在做什么，我来解释下这两张表的DDL具体是什么含义（为什么我要建这两张表）</p>
<p>从<code>message_template</code>这张表开始解释吧，所有的字段我都添加了注释，应该还是比较容易看得懂的。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwhcv4ov3nj314n0u0ahe.jpg"></p>
<p><strong>注：</strong>如果程序由于扩展导致数据库注释有落后，还是有必要更新下（造福后人）</p>
<p>我们需要让所有的消息都有一个「载体」，这个载体说白了就是<strong>模板</strong>，模板是austin系统的基石（有了模板，才能做业务处理，才能溯源，才能数据统计，才能扩展出一整套的建设…）</p>
<p>下面聊下几个可能大家有疑问的几个字段吧：</p>
<ul>
<li><p><code>audit_status</code>和<code>flow_id</code>：模板在发送之前需要经过<strong>审核</strong>（这在发送消息里非常重要，这会很大程度上能防止对消息的误发（相信大家也能看到各大公司都有过发错消息的报道）</p>
</li>
<li><p><code>msg_type</code>消息类型：分隔不同的消息类型，可以在下发时让<strong>不同的类型走不同的通道</strong>进行实现消息隔离（营销类的消息即便堵住了，也不会影响到通知类的消息）</p>
</li>
<li><p><code>send_account</code>发送账号：一个渠道内可能会有多个账号发送（比如，邮件渠道可以选择不同的邮件组进行发送、短信渠道可以选择不同的短信类型账号进行发送）</p>
</li>
<li><p><code>deduplication_time</code>和<code>is_ngiht_shield</code>平台规则：作为发送类型的组件(平台)，需要有<strong>通用</strong>的规则。而去重和夜间屏蔽下发这种就很适合在平台内做</p>
</li>
<li><p><code>msg_conteng</code>：这个字段是作为消息内容发送的<strong>核心</strong>，不同的渠道对应下发的格式都不一样，我后面会直接将JSON存储进去。支持<strong>占位符</strong>的方式进行替换</p>
</li>
<li><p>…</p>
</li>
</ul>
<p>有可能后续还会扩展字段（毕竟在初期考虑设计表的时候，不会尽全尽美）。这种作为模板或者理解为配置的表，从使用上就注定它不会有很大的数据量。</p>
<p>下面来看下<code>sms_record</code>表吧，其实这表能说的不多（就是要把短信发送的记录以及短信的回执存储进去）。它的作用一方面是能追踪到为何发送给某个用户的短信失败了，另一方面是将这些记录进行关联做对账使用。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwih5a2uioj313e0u00xj.jpg"></p>
<h2 id="06、总结"><a href="#06、总结" class="headerlink" title="06、总结"></a>06、总结</h2><p>这篇文章其实想我聊的是：数据库是一个很重要的角色，如果它挂了会影响很大很大。但同时，我们很多时候都是“<strong>轻量级</strong>”地去使用它（通过简单的SQL），它的存在很多时候是因<strong>它能很好地支持事务</strong>（数据强一致性）。</p>
<p>我们最能够信任的数据就是存储在数据库的，其他的存储我们可能担心会丢、会多、会不实时等等（这是数据库比其他存储的最大的优势）</p>
<p><strong>我说得不对一定，不要以我的为准，我们可以在评论区聊</strong></p>
<p>Gitee链接：<a target="_blank" rel="noopener" href="https://gitee.com/zhongfucheng/austin">https://gitee.com/zhongfucheng/austin</a></p>
<p>GitHub链接：<a target="_blank" rel="noopener" href="https://github.com/ZhongFuCheng3y/austin">https://github.com/ZhongFuCheng3y/austin</a></p>

</div>


    <div class="post-guide">
        <div class="item left">
            
              <a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/06.MySQL%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
                  <i class="fa fa-angle-left" aria-hidden="true"></i>
                  06.MySQL环境搭建
              </a>
            
        </div>
        <div class="item right">
            
              <a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
                04.从一条短信开始
                <i class="fa fa-angle-right" aria-hidden="true"></i>
              </a>
            
        </div>
    </div>




<script>
	
	
</script>
	</div>
	<button id="totop-toggle" class="toggle"><i class="fa fa-angle-double-up" aria-hidden="true"></i></button>
</body>
</html>
